error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'

您所在的位置:网站首页 c语言 incomplete type error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'

error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'

2024-07-14 04:52| 来源: 网络整理| 查看: 265

1、问题说明

PolyNode 声明在 poly.h 头文件中:

#ifndef POLYNOMIALCOMPUTE_POLY_H #define POLYNOMIALCOMPUTE_POLY_H struct PolyNode; typedef struct PolyNode *Polynomial; void Attach(int c, int e, Polynomial *pRear); Polynomial PolyAdd(Polynomial P1, Polynomial P2); void PrintPoly(Polynomial P); void TestPoly(); #endif //POLYNOMIALCOMPUTE_POLY_H

PolyNode 定义在 poly.c 文件中:

#include "poly.h" #include #include #include struct PolyNode { Polynomial link; // 指向下一个节点的位置 int expon; // 指数,英文是 exponent int coef; // 系数,英文是 coefficient }; // 新增一个节点 void Attach(int c, int e, Polynomial *pRear) { Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); // 分配空间 P->coef = c; // 对新节点赋值 P->expon = e; P->link = NULL; (*pRear)->link = P; // 尾节点指向P *pRear = P; // 修改 pRear 值 } int Compare(int Lhs, int Rhs) { return Lhs - Rhs; } Polynomial PolyAdd(Polynomial P1, Polynomial P2) { Polynomial front, rear, temp; int sum; rear = (Polynomial)malloc(sizeof(struct PolyNode)); front = rear; // 由 front 记录结果多项式链表头节点 while (P1 && P2) { // 当两个多项式都有非零项待处理时 switch (Compare(P1->expon, P2->expon)) { case 1: Attach(P1->coef, P1->expon, &rear); P1 = P1->link; break; case -1: Attach(P2->coef, P2->expon, &rear); P2 = P2->link; break; case 0: sum = P1->coef + P2->coef; if (sum) Attach(sum, P1->expon, &rear); P1 = P1->link; P2 = P2->link; break; } } // 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去 for(; P1; P1 = P1->link) Attach(P1->coef, P1->expon, &rear); for(; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear); rear->link = NULL; temp = front; front = front->link; // 令 front 指向结果多项式的第一个非零项 free(temp); // 释放临时空表头节点 return front; } void PrintPoly(Polynomial P) { Polynomial tmp = P; for(; tmp; tmp = tmp->link) { printf("%d %d ", tmp->coef, tmp->expon); } } void TestPoly() { int P1Coef[5] = {3, 4, -1, 2, -1}; int P1expon[5] = {5, 4, 3, 1, 0}; int P2Coef[4] = {2, 1, -7, 1};; int P2expon[4] = {4, 3, 2, 1}; Polynomial P1, P2; P1 = (Polynomial)malloc(sizeof(struct PolyNode)); P2 = (Polynomial)malloc(sizeof(struct PolyNode)); Polynomial P1Rear; P1Rear = P1; Polynomial P2Rear; P2Rear = P2; for (int i = 0; i < 5; ++i) { Attach(P1Coef[i], P1expon[i], &P1Rear); // 注意这里传的是地址!!! } P1 = P1->link; // 因为第一个节点没有存储数据,所以 P1 要往后挪一位 for (int i = 0; i < 4; ++i) { Attach(P2Coef[i], P2expon[i], &P2Rear); } P2 = P2->link; Polynomial res = PolyAdd(P1, P2); PrintPoly(P1); printf("\n"); PrintPoly(P2); printf("\n"); PrintPoly(res); }

然后是我的 main,就是在这里出的错:

#include "poly.h" #include #include #include // 测试函数 int main() { Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); // 这里有错 TestPoly(); return 0; }

错误信息:

error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'

20201019083247

2、解决方案

如果你的目的是隐藏这个结构体(structure)的实现,那么你可以在可以访问到这个结构体的 C 文件(比如上面的 poly.c 文件)中这样做:

struct PolyNode * init_PolyNode(...) { struct PolyNode *P = malloc(sizeof(struct PolyNode)); return P; }

否则,如果这个结构体的实现不应该被隐藏,换句话说,main 可以合法地进行这样的操作:

P = (PolyNomial)malloc(sizeof(struct PolyNode)); P->expon = 1;

那么,更好的做法是将结构体的定义放在头文件中(本例中是 poly.h)。

参考:https://stackoverflow.com/questions/8915230/invalid-application-of-sizeof-to-incomplete-type-with-a-struct



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3